From 41293874bd8ed1a5d21eacdff99e704ed064c532 Mon Sep 17 00:00:00 2001 From: robertl Date: Sun, 30 Apr 2006 01:26:40 +0000 Subject: [PATCH] Implement interesting firmware workaround for x05 models to force lap closure so that stored tracks can be retrieved. Note that this forces the widening of the command array to two bytes - it's always technically _been_ two byts, but we've never had a command # > 127 before. This does have the potential to expose naughtiness if we've missed any endian swaps... git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@1976 f51c46e8-681c-474f-0cfe-069cfd0219fb --- gpsbabel/jeeps/gpsapp.c | 53 +++++++++++++++++++++++++++++++++-- gpsbabel/jeeps/gpsapp.h | 2 +- gpsbabel/jeeps/gpsprot.c | 2 +- gpsbabel/jeeps/gpsprot.h | 33 ++++++++++++---------- gpsbabel/jeeps/gpsusbcommon.c | 8 +++--- 5 files changed, 75 insertions(+), 23 deletions(-) diff --git a/gpsbabel/jeeps/gpsapp.c b/gpsbabel/jeeps/gpsapp.c index 31e45b0df..80b789a38 100644 --- a/gpsbabel/jeeps/gpsapp.c +++ b/gpsbabel/jeeps/gpsapp.c @@ -417,7 +417,9 @@ static void GPS_A001(GPS_PPacket packet) case 800: gps_pvt_transfer = pA800; break; - + case 1000: + gps_run_transfer = pA1000; + break; } break; @@ -3417,8 +3419,46 @@ int32 GPS_A300_Get(const char *port, GPS_PTrack **trk) return ret; } +/* + * This is to get around a problem with the x305 sporting units. + * The unit will not "finalize" a track unless the operator manually + * does it from the pushbutton panel OR until the device has gone through + * a 'get runs' cycle. Garmin's Training Center, of course, does this + * because it actually uses that data. Here we just go through the + * mechanics of building and sending the requests and then throwing away + * all the data in order to finalize that. + * + * Hopefully, this won't be needed forever. + */ +drain_run_cmd(gpsdevh *fd) +{ + GPS_PPacket tra; + GPS_PPacket rec; + static UC data[2]; + if(!(tra = GPS_Packet_New()) || !(rec = GPS_Packet_New())) + return MEMORY_ERROR; + GPS_Util_Put_Short(data, + COMMAND_ID[gps_device_command].Cmnd_Transfer_Runs); + GPS_Make_Packet(&tra, LINK_ID[gps_link_type].Pid_Command_Data, + data,2); + + if(!GPS_Write_Packet(fd,tra)) + return gps_errno; + if(!GPS_Get_Ack(fd, &tra, &rec)) + return gps_errno; + + for(;;) { + if(!GPS_Packet_Read(fd, &rec)) + return gps_errno; + if(!GPS_Send_Ack(fd, &tra, &rec)) + return gps_errno; + if(rec->type == LINK_ID[gps_link_type].Pid_Xfer_Cmplt) { + break; + } + } +} /* @func GPS_A301_Get ****************************************************** ** @@ -3451,6 +3491,10 @@ int32 GPS_A301_Get(const char *port, GPS_PTrack **trk) if(!GPS_Device_On(port, &fd)) return gps_errno; + if ((gps_trk_type == pD304) && gps_run_transfer) { + drain_run_cmd(fd); + } + if(!(tra = GPS_Packet_New()) || !(rec = GPS_Packet_New())) return MEMORY_ERROR; @@ -6130,7 +6174,7 @@ void GPS_D906_Get(GPS_PPacket packet, GPS_PLap_Data *Lap) */ const char * -Get_Pkt_Type(unsigned char p, unsigned char d0, const char **xinfo) +Get_Pkt_Type(unsigned char p, unsigned short d0, const char **xinfo) { *xinfo = NULL; #define LT LINK_ID[gps_link_type] @@ -6152,6 +6196,11 @@ Get_Pkt_Type(unsigned char p, unsigned char d0, const char **xinfo) case 92: *xinfo = "Flight Records"; break; case 117: *xinfo = "Xfer Laps"; break; case 121: *xinfo = "Xfer Categories"; break; + case 450: *xinfo = "Xfer Runs"; break; + case 451: *xinfo = "Xfer Workouts"; break; + case 452: *xinfo = "Xfer Wkt Occurrences"; break; + case 453: *xinfo = "Xfer User Profile "; break; + case 454: *xinfo = "Xfer Wkt Limits"; break; default: *xinfo = "Unknown"; } return "CMDDAT"; diff --git a/gpsbabel/jeeps/gpsapp.h b/gpsbabel/jeeps/gpsapp.h index 38a628f32..e12208e4b 100644 --- a/gpsbabel/jeeps/gpsapp.h +++ b/gpsbabel/jeeps/gpsapp.h @@ -57,7 +57,7 @@ int32 GPS_A800_Off(const char *port, gpsdevh **fd); int32 GPS_A800_Get(gpsdevh **fd, GPS_PPvt_Data *packet); void GPS_D800_Get(GPS_PPacket packet, GPS_PPvt_Data *pvt); -const char * Get_Pkt_Type(unsigned char p, unsigned char d0, const char **xinfo); +const char * Get_Pkt_Type(unsigned char p, unsigned short d0, const char **xinfo); #endif diff --git a/gpsbabel/jeeps/gpsprot.c b/gpsbabel/jeeps/gpsprot.c index fabdfd89a..63976d995 100644 --- a/gpsbabel/jeeps/gpsprot.c +++ b/gpsbabel/jeeps/gpsprot.c @@ -37,7 +37,7 @@ static int32 gps_n_tag_unknown = 0; struct COMMANDDATA COMMAND_ID[2]= { { - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x31,0x32,92,117,121 + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x31,0x32,92,117,121,450 } , { diff --git a/gpsbabel/jeeps/gpsprot.h b/gpsbabel/jeeps/gpsprot.h index f9542799d..05ff71857 100644 --- a/gpsbabel/jeeps/gpsprot.h +++ b/gpsbabel/jeeps/gpsprot.h @@ -53,20 +53,21 @@ int32 gps_device_command; struct COMMANDDATA { - UC Cmnd_Abort_Transfer; - UC Cmnd_Transfer_Alm; - UC Cmnd_Transfer_Posn; - UC Cmnd_Transfer_Prx; - UC Cmnd_Transfer_Rte; - UC Cmnd_Transfer_Time; - UC Cmnd_Transfer_Trk; - UC Cmnd_Transfer_Wpt; - UC Cmnd_Turn_Off_Pwr; - UC Cmnd_Start_Pvt_Data; - UC Cmnd_Stop_Pvt_Data; - UC Cmnd_FlightBook_Transfer; - UC Cmnd_Transfer_Lap; - UC Cmnd_Transfer_Wpt_Cats; + US Cmnd_Abort_Transfer; + US Cmnd_Transfer_Alm; + US Cmnd_Transfer_Posn; + US Cmnd_Transfer_Prx; + US Cmnd_Transfer_Rte; + US Cmnd_Transfer_Time; + US Cmnd_Transfer_Trk; + US Cmnd_Transfer_Wpt; + US Cmnd_Turn_Off_Pwr; + US Cmnd_Start_Pvt_Data; + US Cmnd_Stop_Pvt_Data; + US Cmnd_FlightBook_Transfer; + US Cmnd_Transfer_Lap; + US Cmnd_Transfer_Wpt_Cats; + US Cmnd_Transfer_Runs; } ; @@ -138,9 +139,11 @@ int32 gps_pvt_transfer; * Lap Data Transfer */ #define pA906 906 - int32 gps_lap_transfer; +#define pA1000 1000 +int32 gps_run_transfer; + /* diff --git a/gpsbabel/jeeps/gpsusbcommon.c b/gpsbabel/jeeps/gpsusbcommon.c index 94e6adac0..4f8f395b6 100644 --- a/gpsbabel/jeeps/gpsusbcommon.c +++ b/gpsbabel/jeeps/gpsusbcommon.c @@ -101,6 +101,7 @@ top: if (gps_show_bytes) { int i; const char *m1, *m2; + unsigned short pkttype = le_read16(&ibuf->gusb_pkt.databuf[0]); GPS_Diag("RX (%s) [%d]:", receive_state == rs_fromintr ? "intr" : "bulk", rv); @@ -121,8 +122,7 @@ top: GPS_Diag("%c", isalnum(buf[i])? buf[i] : '.'); } - m1 = Get_Pkt_Type(ibuf->gusb_pkt.pkt_id[0], - ibuf->gusb_pkt.databuf[0], &m2); + m1 = Get_Pkt_Type(ibuf->gusb_pkt.pkt_id[0], pkttype, &m2); if ((rv == 0) && (receive_state == rs_frombulk) ) {m1= "RET2INTR";m2=NULL;}; GPS_Diag("(%-8s%s)\n", m1, m2 ? m2 : ""); } @@ -158,6 +158,7 @@ gusb_cmd_send(const garmin_usb_packet *opkt, size_t sz) rv = gusb_llops->llop_send(opkt, sz); if (gps_show_bytes) { + unsigned short pkttype = le_read16(&opkt->gusb_pkt.databuf[0]); GPS_Diag("TX [%d]:", sz); for(i=0;igusb_pkt.pkt_id[0], - opkt->gusb_pkt.databuf[0], &m2); + m1 = Get_Pkt_Type(opkt->gusb_pkt.pkt_id[0], pkttype, &m2); GPS_Diag("(%-8s%s)\n", m1, m2 ? m2 : ""); } -- 2.30.2